// 给定一个整数数组nums，要求判断nums中是否存在三个元素a、b、c，满足 a + b + c === 0,找出所有满足要求的不重复的三元组

// 思路，和上一题类似，双指针法，先排序
// 固定第一个数，然后在剩余的区间里判断并更新left和right指针，这里需要注意重复元素的判断和跳过
// 时间复杂度：O(n^2)
// 空间复杂度：O(1)

function threeSum(arr) {
    let ans = []
    arr.sort((a, b) => a - b)
    for (let i = 0; i < arr.length - 2; i++) {
        if (arr[i] > 0) {
            return ans
        }
        // 把当前值和上一个值比较，如果已经处理过就跳过，不是和后面的比较，这个要清楚
        if (arr[i] === arr[i-1]) {
            continue
        }
        let left = i + 1
        let right = arr.length - 1
        while (left < right) {
            let sum = arr[i] + arr[left] + arr[right]
            if (sum < 0) {
                left++
            } else if (sum > 0) {
                right--
            } else {
                ans.push([arr[i], arr[left], arr[right]])
                while (left < right && arr[right] === arr[right-1]) {
                    right--
                }
                while (left < right && arr[left] === arr[left+ 1]) {
                    left++
                }
                right--
                left++
            }
        }
    }
    return ans
}

let nums2 = [-1, 0, 1, 2, -1, -4]
console.log(threeSum(nums2))